﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DECOR.BL.BE
{
    public class DetalleBE
    {
        //private decimal _igvValor = 19m;

        public DetalleBE()
        {
            this._cantidad = 0m;
            this._cantComp = 0m;
            this._cantConfirmada = 0m;
            
            //this._fechaEntrega = DateTime.Today;
            this._fechaCantConf = new DateTime();

            this._dctoGerenciaPorc = new DescuentoBE(); this._dctoGerenciaPorc.Condicion = "ZD04";
            this._dctoGerenciaMonto = new DescuentoBE(); this._dctoGerenciaMonto.Condicion = "ZD05";
            this._dctoEstadisticoPorc = new DescuentoBE(); this._dctoEstadisticoPorc.Condicion = "ZD03";
            this._dctoDecorPorc = new DescuentoBE(); this._dctoDecorPorc.Condicion = "ZD00";
            
            this._dctoDecorMonto = new DescuentoBE(); this._dctoDecorMonto.Condicion = "ZD01";
            this._dctoAdicionalPorc = new DescuentoBE(); this._dctoAdicionalPorc.Condicion = "ZD02";

            this._precio = new DescuentoBE(); this._precio.Condicion = "ZP00";
            this._diferencia = new DescuentoBE(); this._diferencia.Condicion = "ZP01";
            this._igv = new DescuentoBE(); this._igv.Condicion = "MWST";
            
            this._dctoZD06 = new DescuentoBE("ZD06");
            this._dctoZD07 = new DescuentoBE("ZD07");
            this._preZP08 = new DescuentoBE("ZP08");
            this._dctoZD11 = new DescuentoBE("ZD11");
            this._dctoGenerico = new DescuentoBE("ZD09"); //rgutierrez 15.12.2011
            this._dctoGenericoZD08 = new DescuentoBE("ZD08"); //rgutierrez 15.12.2011

            this._percepcion = new DescuentoBE(); this._percepcion.Condicion = "ZPRC"; //percepciones
            

            this._repartos = new List<RepartoBE>();
            //RepartoBE x = new RepartoBE(); x.FechaEntrega = this._fechaEntrega; x.CantPed = this._cantidad;
            this._repartos.Add(new RepartoBE());

            this.Material = new MaterialBE();
            this.PosSup = "00";

            this._motivoRechazo = string.Empty;
            this._zservicio = true;
            this._dsctoMontTotal = 0m;
            this._cambAlmacen = false;

            //rhuapaya 25.06.2012 @@@ se adiciono el descuento ZD12
            this.DsctoAdicionalZD12 = new DescuentoBE("ZD12");

        }
        private string _tipoPosAnt;
        public string TipoPosAnt
        {
            get { return _tipoPosAnt; }
            set { _tipoPosAnt = value; }
        }
        private string _Reembolsable;
        public string Reembolsable
        {
            get { return _Reembolsable; }
            set { _Reembolsable = value; }
        }
        
        private decimal _dsctoMontTotal;
        public decimal DsctoMontTotal
        {
            get { return _dsctoMontTotal; }
            set { _dsctoMontTotal = value; }
        }


        private DescuentoBE _preZP08;

        public DescuentoBE PreZP08
        {
            get { return _preZP08; }
            set { _preZP08 = value; }
        }

        private DescuentoBE _dctoZD11;

        public DescuentoBE DctoZD11
        {
            get { return _dctoZD11; }
            set { _dctoZD11 = value; }
        }

        private DescuentoBE _dctoZD07;

        public DescuentoBE DctoZD07
        {
            get { return _dctoZD07; }
            set { _dctoZD07 = value; }
        }
        private DescuentoBE _dctoGenerico;

        public DescuentoBE DctoGenerico
        {
            get { return _dctoGenerico; }
            set { _dctoGenerico = value; }
        }

        private DescuentoBE _dctoGenericoZD08;

        public DescuentoBE DctoGenericoZD08
        {
            get { return _dctoGenericoZD08; }
            set { _dctoGenericoZD08 = value; }
        }

        private DescuentoBE _dctoZD06;

        public DescuentoBE DctoZD06
        {
            get { return _dctoZD06; }
            set { _dctoZD06 = value; }
        }

        private bool _zservicio;

        public bool Zservicio
        {
            get { return _zservicio; }
            set { _zservicio = value; }
        }

        public string ContentID
        {
            get { return this.PosicionCorto + this.CodMaterialCorto; }
        }

        public string DescMovil
        {
            get 
            { 
                //rgutierrez 16.12.2011
                return PosicionCorto + " - " + CodMaterialCorto + " " + DescMaterial.PadRight(40,'_') + " - " + Cantidad + " - " + Total;
                //return this.PosicionCorto + " - " + this.CodMaterialCorto + " " + this.DescMaterial + " - " + this.Cantidad + " - " + this.Total; 
            }
        }

        private MaterialBE _material;

        public MaterialBE Material
        {
            get { return _material; }
            set { _material = value; }
        }

        private string _codMaterial;

        /// <summary>
        /// string 18
        /// </summary>
        public string CodMaterial
        {
            get { return _codMaterial.PadLeft(18, '0'); }
            set { _codMaterial = value; }
        }

        public string CodMaterialCorto
        {
            get
            {
                if (_codMaterial.Trim() == "") //rgutierrez 31.01.2012
                    return "";
                else
                    return Convert.ToInt64(_codMaterial).ToString(); 
            }
        }

        private string _descMaterial;

        public string DescMaterial
        {
            get { return _descMaterial; }
            set { _descMaterial = value; }
        }

        //rgutierrez 03.02.2012
        public string DescMaterialTicketera
        {
            get
            {
                if (_descMaterial.Length > 35)
                    return _descMaterial.Substring(0, 35);
                else
                    return _descMaterial;
            }
        }

        private decimal _cantidad;

        public decimal Cantidad
        {
            get { return decimal.Round(_cantidad, 3); }
            set { _cantidad = value; }
        }

        private decimal _cantComp;
        /// <summary>
        /// cantidad de componente (para kits y combos)
        /// </summary>
        public decimal CantComp
        {
            get { return _cantComp; }
            set { _cantComp = value; }
        }

        private string _codUMedida;

        public string CodUMedida
        {
            get { return _codUMedida; }
            set { _codUMedida = value; }
        }

        //--- precios:
        public decimal PrecioUnitario
        {
            get { return this.Precio.Importe; }
        }

        public decimal PrecioTotal
        {
            //get { return this.Diferencia.Importe > 0m ? decimal.Round(this.Diferencia.Importe, 2) : decimal.Round(this.PrecioUnitario * this.Cantidad, 2); }
            //get { return this.Diferencia.Importe > 0m ? decimal.Round(this.Diferencia.Importe, 2) : decimal.Round(this.Precio.Valor, 2); }
            get { return this.Diferencia.Importe > 0m ? decimal.Round(this.Diferencia.Importe, 2) : this.PreZP08.Importe > 0m ? decimal.Round(this.PreZP08.Importe, 2) : decimal.Round(this.Precio.Valor, 2); }
        }

        public decimal Total
        {
            get { return decimal.Round(this.SubTotal + this.IgvTotal, 2); }
        }

        public decimal IgvUnitario
        {
            get { return (this.Igv.Importe > 100 ? this.Igv.Importe / 10 : this.Igv.Importe); }
        }

        public decimal IgvTotal
        {
            //rgutierrez 02.12.2011 No estaba considerando la diferencia ZP01 en una Nota de credito Z021
            //get { return this.Igv.Valor; }
            get { return decimal.Round(this.IgvUnitario * this.SubTotal / 100, 2); }
        }

        public decimal TotalDctos
        {
            get
            {
                //rgutierrez 09.12.2011 Se agregaron los descuentos ZD09 y ZD11
                return decimal.Round((Math.Abs(this._dctoAdicionalPorc.Valor) + Math.Abs(this._dctoDecorMonto.Valor) + Math.Abs(this._dctoDecorPorc.Valor) + Math.Abs(this._dctoGerenciaMonto.Valor) + Math.Abs(this._dctoGerenciaPorc.Valor) + Math.Abs(this._dctoZD06.Valor) + Math.Abs(this._dctoZD07.Valor) + Math.Abs(this._dctoGenericoZD08.Valor) + Math.Abs(this._dctoGenerico.Valor) + Math.Abs(this._dctoZD11.Valor) + Math.Abs(this.DsctoAdicionalZD12.Valor)), 2);
                //return decimal.Round((Math.Abs(this._dctoAdicionalPorc.Valor) + Math.Abs(this._dctoDecorMonto.Valor) + Math.Abs(this._dctoDecorPorc.Valor) + Math.Abs(this._dctoGerenciaMonto.Valor) + Math.Abs(this._dctoGerenciaPorc.Valor) + Math.Abs(this._dctoZD06.Valor) + Math.Abs(this._dctoZD07.Valor) + Math.Abs(this._dctoGenericoZD08.Valor)), 2);
            }
        }

        public decimal SubTotal
        {
            get
            {
                return decimal.Round(this.PrecioTotal - Math.Abs(this.TotalDctos), 2);
            }
        }
        //------------------------------------------

        private decimal _totpercep;
        public decimal TotPercep
        {
            get
            {
                return _totpercep;
            
                //return decimal.Round(this.Total > 700 ? (this._percepcion.Importe == 0 ? this.Total * this._percepcion.Valor / 100 : this._percepcion.Importe) : 0 );
            
            
            }
            set { _totpercep = value; }
        
        }

        private DescuentoBE _igv;

        public DescuentoBE Igv
        {
            get { return _igv; }
            set { _igv = value; }
        }

        private DescuentoBE _percepcion;

        public DescuentoBE Percepcion //percepciones
        {
            get { return _percepcion; }
            set { _percepcion = value; }
        } //percepciones

          private DescuentoBE _precio;

        public DescuentoBE Precio
        {
            get { return _precio; }
            set { _precio = value; }
        }

        private DescuentoBE _diferencia;

        public DescuentoBE Diferencia
        {
            get { return _diferencia; }
            set { _diferencia = value; }
        }

        private DescuentoBE _dctoDecorPorc;

        /// <summary>
        /// Condición: 
        /// </summary>
        public DescuentoBE DctoDecorPorc
        {
            get { return _dctoDecorPorc; }
            set { _dctoDecorPorc = value; }
        }

        private DescuentoBE _dctoDecorMonto;

        public DescuentoBE DctoDecorMonto
        {
            get { return _dctoDecorMonto; }
            set { _dctoDecorMonto = value; }
        }

        private DescuentoBE _dctoAdicionalPorc;

        public DescuentoBE DctoAdicionalPorc
        {
            get { return _dctoAdicionalPorc; }
            set { _dctoAdicionalPorc = value; }
        }

        private DescuentoBE _dctoEstadisticoPorc;

        public DescuentoBE DctoEstadisticoPorc
        {
            get { return _dctoEstadisticoPorc; }
            set { _dctoEstadisticoPorc = value; }
        }

        private DescuentoBE _dctoGerenciaPorc;

        public DescuentoBE DctoGerenciaPorc
        {
            get { return _dctoGerenciaPorc; }
            set { _dctoGerenciaPorc = value; }
        }

        private DescuentoBE _dctoGerenciaMonto;

        public DescuentoBE DctoGerenciaMonto
        {
            get { return _dctoGerenciaMonto; }
            set { _dctoGerenciaMonto = value; }
        }

        //------------------------------------------
        //private DateTime _fechaEntrega;
        /// <summary>
        /// 1era fecha de reparto
        /// </summary>
        //public DateTime FechaEntrega
        //{
        //    get { return _repartos.Count > 0 ? _repartos[0] : DateTime.Today; }
        //    //get { return _fechaEntrega; }
        //    //set { _fechaEntrega = value; }
        //}

        public string FechaEntregaString
        {
            get { return _repartos.Count > 0 ? _repartos[0].FechaEntrega.ToString("dd/MM/yyyy") : (new DateTime()).ToString("dd/MM/yyyy"); }
        }

        private string _prioridadEntrega;

        public string PrioridadEntrega
        {
            get { return _prioridadEntrega; }
            set { _prioridadEntrega = value; }
        }

        public string Reparto
        {
            get { return PrioridadEntrega + " " + (_repartos.Count > 0 ? _repartos[0].FechaEntrega.ToString("dd/MM/yy") : (new DateTime()).ToString("dd/MM/yy")); }
        }

        private decimal _cantConfirmada;

        public decimal CantConfirmada
        {
            get { return _cantConfirmada; }
            set { _cantConfirmada = value; }
        }

        private DateTime _fechaCantConf;

        public DateTime FechaCantConf
        {
            get { return _fechaCantConf; }
            set { _fechaCantConf = value; }
        }

        public string FechaCantConfStr
        {
            get { return (_fechaCantConf == new DateTime() ? "-" : _fechaCantConf.ToString("dd/MM/yyyy")); }
        }
        //-------------------------------------------

        private string _codCentro;//char4

        public string CodCentro
        {
            get { return _codCentro; }
            set { _codCentro = value; }
        }

        private bool _cambAlmacen;//char4

        public bool CambAlmacen
        {
            get { return _cambAlmacen; }
            set { _cambAlmacen = value; }
        }

        private string _codAlmacen;//char4

        public string CodAlmacen
        {
            get { return _codAlmacen; }
            set { _codAlmacen = value; }
        }

        private string _codLote;//char10

        public string CodLote
        {
            get { return _codLote; }
            set { _codLote = value; }
        }

        private string _posicion;

        public string Posicion
        {
            get { return _posicion.PadLeft(6, '0'); }
            set { _posicion = value; }
        }

        private string _posSup;

        public string PosSup
        {
            get { return _posSup.PadLeft(6, '0'); }
            set { _posSup = value; }
        }

        public string PosicionCorto
        {
            get { return _posicion.TrimStart('0'); }
        }
        public string PosSupCorto
        {
            get { return _posSup.TrimStart('0'); }
        }

        private decimal _peso;

        public decimal Peso
        {
            get { return _peso; }
            set { _peso = value; }
        }

        public decimal PesoNeto
        {
            get { return decimal.Round(_peso * _cantidad, 3); }
        }

        //-----------

        private string _uMedidaRendimiendo;
        /// <summary>
        /// MEINH: Unidad medida para visualización
        /// </summary>
        public string UMedidaRendimiendo
        {
            get { return _uMedidaRendimiendo; }
            set { _uMedidaRendimiendo = value; }
        }

        private decimal _valorRendimiento;
        /// <summary>
        /// UMREZ: Contador para la conversión en unidades de medida base
        /// </summary>
        public decimal ValorRendimiento
        {
            get { return decimal.Round(_valorRendimiento, 3); }
            set { _valorRendimiento = value; }
        }

        /// <summary>
        /// concatena el valor del rendimiento con la unidad.
        /// </summary>
        public string Rendimiento
        {
            get { return (ValorRendimiento != 0m ? ValorRendimiento.ToString() + " " + UMedidaRendimiendo : "-"); }
        }

        private string _tipoMaterial;

        /// <summary>
        /// NA = Nacional
        /// IM = Importado
        /// </summary>
        public string TipoMaterial
        {
            get { return _tipoMaterial; }
            set { _tipoMaterial = value; }
        }

        private string _codGrupoMat;

        public string CodGrupoMat
        {
            get { return _codGrupoMat; }
            set { _codGrupoMat = value; }
        }

        private string _motivoRechazo;

        public string MotivoRechazo
        {
            get { return _motivoRechazo; }
            set { _motivoRechazo = value; }
        }

        //------------------------------
        //--- campos para la impresión:
        private decimal _precioSinIGV;

        public decimal PrecioSinIGV
        {
            get { return decimal.Round(_precioSinIGV, 2); }
            set { _precioSinIGV = value; }
        }

        public decimal PrecioConIGV
        {
            get { return decimal.Round(this.PrecioSinIGV + (this.PrecioSinIGV * this.IgvUnitario / 100), 2); }
        }

        private decimal _totalImpresion;

        public decimal TotalImpresion
        {
            get { return decimal.Round(_totalImpresion, 2); }
            set { _totalImpresion = value; }
        }

        private string _tipoPosicion;
        /// <summary>
        /// Tipo de posición para Kits y Combos [z012 y z017]
        /// </summary>
        public string TipoPosicion
        {
            get { return _tipoPosicion; }
            set { _tipoPosicion = value; }
        }

        private List<RepartoBE> _repartos;

        public List<RepartoBE> Repartos
        {
            get { return _repartos; }
            set { _repartos = value; }
        }

        //rgutierrez 15.11.2011
        public string ConversionUMedida
        {
            get {
                if (_valorRendimiento == 0)
                {
                    return "";
                }
                else
                {
                    return Math.Round(_cantidad / _valorRendimiento).ToString() + ' ' + _uMedidaRendimiendo; 
                }
            }
        }

        public List<GenericBE> lstCentros { get; set; }
        public List<GenericBE> lstAlmacen { get; set; }
        public List<GenericBE> lstLotes { get; set; }

        public string JerarquiaPrincipalDesc { get; set; }

        //rhuapaya 22.06.2012 descuento nuevo @@@
        public DescuentoBE DsctoAdicionalZD12 { get; set; }  
      
        //mtejada 26.03.2013 - M239-BBP
        private string _StatusDespacho;

        public string StatusDespacho
        {
            get { return _StatusDespacho; }
            set { _StatusDespacho = value; }
        }
        private string _StockPos;

        public string StockPos
        {
            get { return _StockPos; }
            set { _StockPos = value; }
        }

    }
}
